package com.tjhk.java.tech;
import java.lang.reflect.Field;
import java.math.BigInteger;

/**
 * @author ：little grape
 * @description：TODO
 * @date ：2022/11/24 09:57
 */
public class IntegerTest {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        /**
         * Integer.IntegerCache.cache 类加载时会缓存-128～127个Integer对象数组
         * 当赋值时执行
         *  public static Integer valueOf(int i) {
         *         if (i >= IntegerCache.low && i <= IntegerCache.high)
         *             return IntegerCache.cache[i + (-IntegerCache.low)];
         *         return new Integer(i);
         *     }
         *  所以在-128～127范围内返回的是同一对象
         *  超出范围则new
         *  
         *  缓存取值范围
         *  int\integer(-128,127)
         *  long\Long(-128,127)
         *  byte\Byte(-128,127)
         *  short\Short(-32768,32726)
         *  char\Character(0,127)
         */

        System.out.println();
        Integer a = 100 ,b = 100;
        System.out.println(a==b);
        Integer c = 1000,d= 1000;
        System.out.println(c==d);

        Class[] clazz = Integer.class.getDeclaredClasses();
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field field = cache.getDeclaredField("cache");
        field.setAccessible(true);
        Integer[] newCache = (Integer[]) field.get(cache);
        System.out.println(newCache[132]+newCache[133]);
        newCache[132] = newCache[133];
        int aa= 2;
        int bb = 2+2;
        System.out.printf("%d+%d =%d",aa,aa,bb);
        System.out.println();
        /**
         * 自动拆箱 自动装箱
         */
        Integer i1 = 100; // 自动装箱 调用Integer.valueOf方法
        int k = i1; // 自动拆箱
        // new 在堆内存中重新分配地址 首地址将存在栈内存中 == 比较的是引用地址也就是栈中的地址，顾new 对象是不相等的
        Integer i2 = new Integer(100);
        int j = 100;
        System.out.println(i1 == i2);
        // 拆箱后判断  调用intValue方法
        System.out.println(i1 == j);
        System.out.println(i2 == j);

        Boolean b1 = false;
        boolean b2 = false;
        Boolean b3 = new Boolean(false);
        System.out.println(b1 == b2);
        System.out.println(b1 == b3);
        BigInteger bigInteger = BigInteger.valueOf(0x4000000000000000L);

    }
}
